#ifndef SCHEDULER_H
#define SCHEDULER_H

#include <stdint.h>

// 任务状态枚举
typedef enum {
    TASK_READY = 0,      // 就绪状态
    TASK_RUNNING,        // 运行状态
    TASK_BLOCKED,        // 阻塞状态
    TASK_TERMINATED      // 终止状态
} task_state_t;

// 任务控制块(PCB)结构体
typedef struct task_struct {
    uint32_t pid;                   // 进程ID
    char name[32];                  // 任务名称(最长31个字符)
    task_state_t state;             // 任务状态
    uint32_t time_slice;            // 时间片(毫秒)
    uint32_t elapsed_time;          // 本次运行已消耗的时间(毫秒)
    void (*entry)(void*);           // 任务入口函数
    void* arg;                      // 函数参数
    struct task_struct* next;       // 链表指针(指向下一个任务)
} task_t;

/**
 * 初始化调度器
 * 会创建一个空闲任务(idle task)作为默认任务
 */
void scheduler_init(void);

/**
 * 创建新任务
 * @param name 任务名称
 * @param entry 任务入口函数
 * @param arg 传递给任务函数的参数
 * @param time_slice 时间片(毫秒)
 * @return 成功返回任务PID,失败返回-1
 */
int create_task(const char* name, void (*entry)(void*), 
                void* arg, uint32_t time_slice);

/**
 * 触发任务调度(Round-Robin轮转算法)
 * 从当前任务切换到下一个就绪任务
 */
void schedule(void);

/**
 * 获取当前运行的任务
 * @return 当前任务的指针
 */
task_t* get_current_task(void);

/**
 * 打印所有任务的状态信息
 * 包括PID、名称、状态、时间片、已运行时间
 */
void print_tasks(void);

#endif // SCHEDULER_H

